// api.js 统一管理所有的接口 = > 请求方法,拿到返回值

// ajax请求是异步的
// js解析异步 => 一行一行执行,遇到异步代码,就会将异步放到异步队列中,
// 等同步代码都执行完成之后,在来队列里来拿返回结果
// 异步:
// ajax 定时器 事件等

// 回调函数 = > 将函数当成形参,被调用了
// 一般处理异步:
// 异步外面想拿到异步里边的结果的时候,就需要回调函数

// 做了什么?
// 封装了接口 
// api.js文件 => 
// 当前文件只做一个事, 处理接口拿到数据,通过回调函数,返回出去
// 解决异步

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么\
  // 发送请求=>多个接口 
  // headers:{Authorization:AUTH_TOKEN}

  // 做筛选 以 /api 开头的请求路径，不需要访问权限
  // /api/reguser   /api/login
  // if(config.url !=='/api/reguser' || config.url !=='/api/login'){
  // startsWith()  判断以什么开头  返回的是布尔值
  // startsWith() /api 
  // 不是/api开头 ,都是/my开头 
  if (!config.url.startsWith('/api')) {
    // config 对象 => config 添加头部haaders  {Authorization:AUTH_TOKEN}
    // config.headers.Authorization
    const AUTH_TOKEN = localStorage.getItem('token')
    config.headers['Authorization'] = AUTH_TOKEN
  }


  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});


// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  // 执行时机 => 比接口拿到数据快
  // response => 接口的数据返回结果
  // 所有的请求 => 全局的
  // 省去重复的代码 ,只在这里写一处弹窗就可以了
  // console.log('响应拦截器的返回结果', response);
  const { message, status } = response.data
  // console.log(message);
  // 提示 =>不管你是否注册成功，都需要提示用户
  layer.msg(message);
  // 后台接口状态 status 返回的是其他值2,3 xxx 
  if (status === 0) {
    // 成功拿到信息
  }
  // 判断 => 登录注册 '/api' 如果status ===1 不让它跳转到登录页面
  if (status === 1 && !config.url.startsWith('/api')) {
    // 做一个判断 status === 1 身份验证失败 => 
    // 为了保证代码的严谨性 => token 清除掉
    localStorage.removeItem('token')
    // 跳转到登录页面
    location.href = '/login.html'
  }
  // status 0 和 1 不严格
  // status 443 => 判断token是否失效了 
  // 特别严谨的处理
  // 单独的status的值 判断token是否失效了 

  // 单独的status的值 判断接口传参错误

  // console.log('请求拦截器',config);
  return response;
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error);
});


// 配置了axios全局的baseURL => 会自动的拼接url
axios.defaults.baseURL = 'http://api-breakingnews-web.itheima.net';
// const AUTH_TOKEN = localStorage.getItem('token')
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
/**
 * 用户注册接口
 * /api/reguser
 * POST
 * username=xxx&password=xxx
 */
const postReguser = (data2, cb) => {
  axios.post('/api/reguser', data2).then(res => {
    // console.log('api文件postReguser返回的值 ~', res);
    // 在这个地方拿到res的值,通过cb回调函数 ,给到页面中调用的位置 
    // res是一个实参
    cb(res)
  })
}

/**
 * 用户登录接口
 * /api/login
 * POST
 * username=xxx&password=xxx
 */
const postLogin = (data2, cb) => {
  axios.post('/api/login', data2).then(res => {
    // console.log('登录接口返回结果成功了~', res.data);
    cb(res)

  })
}

/**
 * 获取用户的基本信息
 * /my/userinfo
 * GET
 */
const getUserInfo = (cb) => {
  const AUTH_TOKEN = localStorage.getItem('token')
  // {
  //   headers:{
  //     Authorization:AUTH_TOKEN
  //   }
  // }
  axios.get('/my/userinfo', {
    // headers:{Authorization:AUTH_TOKEN}
  }).then(res => {
    cb(res)
  })
}

/**
 * 更新用户的基本信息
 * /my/userinfo
 * POST
 * id=''&nickname="ww"&email="11"
 */
const postUpadateUserInfo = (data, cb) => {
  axios.post('/my/userinfo', data).then(res => {
    cb(res)
  })
}

/**
 * 重置密码
 * /my/updatepwd
 * POST
 * oldPwd=111&newPwd="1231"
 */
const postUpdatepwd = (data, cb) => {
  axios.post('/my/updatepwd', data).then(res => {
    cb(res)
  })
}

/**
 * 更换头像
 * /my/update/avatar
 * POST
 * avatar="base64的字符串"
 */

const postUpdateAvatar = (data, cb) => {
  axios.post('/my/update/avatar', data).then(res => {
    cb(res)
  })
}

/**
 * 获取文章分类列表
 * /my/article/cates
 * GET
 * 
 * 
 * 
 * 
 * 
 */
const getArticleCates = (cb) => {
  axios.get('/my/article/cates').then(res => {
    cb(res)
  })
}

/**
 * 新增文章分类
 * /my/article/addcates
 * POST
 * name=xxxx&alias=xxx
 */
const postAddCates = (data, cb) => {
  axios.post('/my/article/addcates', data).then(res => {
    cb(res)
  })
}

/**
 * 根据 Id 删除文章分类
 * /my/article/deletecate/:id
 * GET
 */
const getDeleteArticle = (id, cb) => {
  // /my/article/deletecate/:id  :id  = > 动态的id
  axios.get(`/my/article/deletecate/${id}`).then(res => {
    cb(res)
  })
}

/**
 * 根据 Id 获取文章分类数据
 * /my/article/cates/:id
 * GET
 */
const getArticleById = (id, cb) => {
  // /my/article/deletecate/:id  :id  = > 动态的id
  axios.get(`/my/article/cates/${id}`).then(res => {
    cb(res)
  })
}

/**
 * 根据 Id 更新文章分类数据
 * /my/article/updatecate
 * POST
 * Id	是	int	分类 Id
 * name	是	string	分类名称
 * alias	是	string	分类别名
 * 
 */
const postUpdateArticle = (data, cb) => {
  axios.post('/my/article/updatecate', data).then(res => {
    cb(res)
  })
}

/**
 * 发布新文章
 * /my/article/add
 * POST
 * title	是	string	文章标题
 * cate_id	是	int	所属分类 Id
 * content	是	string	文章内容
 * cover_img	是	blob二进制	文章封面
 * state	是	string	状态，可选值为：已发布、草稿
 */
const postAddArticle = (data,cb)=>{
  axios.post('/my/article/add',data).then(res=>{
    cb(res)
  })
}
/**
 * 获取文章的列表数据
 * /my/article/list
 * get
 * 
 *  * pagenum	是	int	页码值
      pagesize	是	int	每页显示多少条数据
      cate_id	否	string	文章分类的 Id
      state	否	string	文章的状态，可选值有：已发布、草稿
    * data:{
      pagenum:1,
      pagesize:2,
    }
 * 
 */
const getArticleList = (data,cb)=>{
  axios.get('/my/article/list', {
    params: data
  }).then(res=>{
    cb(res)
  })
}


/**
 * 根据 Id 获取文章详情
 * /my/article/:id
 * GET
 */
 const getArticleDetailById = (id, cb) => {
  // /my/article/:id  :id  = > 动态的id
  axios.get(`/my/article/${id}`).then(res => {
    cb(res)
  })
}


/**
 * 根据 Id 更新文章信息
 * /my/article/edit
 * POST
 * FormData 
 */
 const postArticleEdit = (data, cb) => {
  axios.post('/my/article/edit', data).then(res => {
    // console.log('登录接口返回结果成功了~', res.data);
    cb(res)
  })
}


/**
 * 根据 Id 删除文章数据
 * /my/article/delete/:id
 * GET
 */
 const getArticleDeleteById = (id, cb) => {
  // /my/article/delete/:id  :id  = > 动态的id
  axios.get(`/my/article/delete/${id}`).then(res => {
    cb(res)
  })
}